#pragma once
#include "Channel.h"
#include "EventLoop.h"
#include <iostream>
using namespace std;

class EventLoop;

class Dispatcher { // 事件分发器: 包含6个函数指针, 具有检测功能
public:
	Dispatcher(EventLoop* evLoop);
	virtual ~Dispatcher();

	// 设置_curChannel
	void setChannel(Channel* channel) { _curChannel = channel; }

	// 添加: 将[_curChannel.fd]添加到epoll/poll/select模型
	virtual int add();

	// 删除: 将[_curChannel.fd]从epoll/poll/select模型中删除, 并释放_curChannel所属的TcpConnection
	virtual int remove();

	// 修改: 修改epoll/poll/select模型中的[_curChannel.fd]的属性
	virtual int modify();

	// 事件检测: 检测epoll/poll/select模型上的[_curChannel.fd]是否被激活(是否有就绪事件), 阻塞等待timeout秒
	virtual int dispatch(int timeout = 2);
protected:
	string _name = string(); // 事件分发器的名字
	Channel* _curChannel;    // 当前需要处理的channel(动态的)
	EventLoop* _eventLoop;   // 所属的EventLoop
};